import Page
import allure
from time import sleep
from Base.base import Base
from Base.get_driver import get_driver
from selenium.webdriver.common.by import By

"""Page_Upgrade类，作为升级列表页,继承Base类"""


class PageUpgrade(Base):

    # ---------------------------------------[单个操作]依赖/组合业务/断言使用-----------------------------------------------

    @allure.step(title="点击 上传")
    def page_click_upload_btn(self):
        self.click_element(Page.up_loading_ota_btn)

    @allure.step(title="上传升级包 -->上传文件")
    def page_upload_file(self, file_path):
        sleep(3)
        self.add_img(file_path, Page.up_file_btn)

    @allure.step(title="上传升级包 -->点击下拉框")
    def page_click_type_select(self):
        sleep(3)
        self.click_element(Page.up_type_select)

    @allure.step(title="上传升级包 -->选择下拉选项")
    def page_sel_option(self, ipc_type):
        sleep(1)
        if ipc_type == "抓拍机":
            self.click_element(Page.com_option_first)
        sleep(1)
        if ipc_type == "客流识别机":
            self.click_element(Page.com_option_second)
        sleep(1)
        if ipc_type == "识别机":
            self.click_element(Page.com_option_third)
        sleep(1)

    @allure.step(title="上传升级包 -->输入OTA版本名称")
    def page_enter_version_name(self, version):
        sleep(3)
        self.send_element(Page.up_version_name, version)

    @allure.step(title="上传升级包 -->输入OTA版本名称")
    def page_enter_up_description(self, description):
        self.send_element(Page.up_description, description)
        sleep(3)

    @allure.step(title="点击 第一个删除")
    def page_click_first_del_btn(self):
        sleep(1)
        self.click_element(Page.up_first_del_but)

    @allure.step(title="点击 下拉框")
    def page_click_select(self):
        sleep(1)
        self.click_element(Page.up_ota_select_btn)

    @allure.step(title="获取ota包版本文本值")
    def page_get_ota_version(self, description):  # 通过更新说明description
        try:
            toast_xpath = "//span[starts-with(text(),'{}')]/../../td[2]".format(description)
            return self.search_element((By.XPATH, toast_xpath), timeout=5).text
        except:
            return ""

    @allure.step(title="ota搜索框 -->输入搜索值")
    def page_enter_search_text(self, search_text):
        self.send_element(Page.up_ota_search_input, search_text)

    # 通过搜索内容search_text -->返回搜索出的所有文本值列表及数量【断言依赖】
    @allure.step(title="获取升级列表信息")
    def page_get_ota_text(self, search_text):
        try:
            sleep(3)
            a = 0
            all_text = []
            while a < 1:
                # 调用 通过文本定位一组元素 -->定位所有含search_text值的元素
                all_text_ele = self.text_search_elements(search_text)
                text_num = len(all_text_ele)
                for i in range(0, text_num):
                    if all_text_ele[i].text == "" or len(all_text_ele[i].text) < 6:
                        pass
                    else:
                        all_text.append(all_text_ele[i].text)
                a += 1
            sleep(3)
            all_text = list(all_text)
            allure.attach("描述", "升级列表含{}的所有文本：{}".format(search_text, all_text))
            allure.attach("描述", "升级列表含{}的所有文本数量:{}".format(search_text, len(all_text)))
            return all_text, len(all_text)
        except Exception as e:
            allure.attach("失败描述", "获取升级列表信息失败，原因：{}".format(e))
            # 截图
            self.screen_page()
            # 刷新
            self.refresh_current_page()
            assert False

    @allure.step(title="获取升级列表显示列表数")
    def page_get_list_num(self):
        try:
            sleep(5)
            list_num = len(self.search_elements(Page.up_ota_type_text))
            allure.attach("描述","获取升级列表显示列表数: [{}]".format(list_num))
            return list_num
        except Exception as e:
            allure.attach("失败描述", "获取升级列表显示列表数失败，原因：{}".format(e))
            assert False

    @allure.step(title="判断取消按钮是否可以点击")
    def if_cancel_disabled(self):
        cancel = self.search_element(Page.app_cancel_btn).get_attribute("disabled")
        return cancel

    # 获取升级列表数
    def get_list_num(self):
        try:
            list_num =len(self.text_search_elements("2019"))
            allure.attach("描述", "页面ota包数:[{}]".format(list_num))
            return list_num
        except Exception:
            allure.attach("描述", "升级列表为空无需清除")
            return 0

    def del_ota(self):
        i = 0
        while i < self.get_list_num():
            # 删除OTA包
            self.del_ota_file()
            if self.get_ota_toast() != "删除成功":
                assert False
            sleep(2)
            i += 1

    # ---------------------------------------------------[组合业务]test脚本使用----------------------------------------------

    # 组合业务方法 -->清空ota列表 【上传OTA包的前置条件】
    @allure.step(title="清空ota列表")
    def clear_ota_list(self):
        try:
            self.del_ota()
            while self.get_list_num()>0:
               self.del_ota()
        except Exception as e:
            allure.attach("失败描述", "清空ota列表失败，原因：{}".format(e))
            # 刷新
            self.refresh_current_page()
            # assert False

    # 组合业务方法  -->上传OTA包业务直接调用
    @allure.step(title="上传OTA包操作")
    def uploading_ota(self, ipc_type, file_path, version, description):
        try:
            # 调用 点击上传按钮
            self.page_click_upload_btn()
            # 调用 上传OTA文件
            self.page_upload_file(file_path)
            # 调用 点击类型下拉框
            self.page_click_type_select()
            # 调用 选择设备机型
            self.page_sel_option(ipc_type)
            # 调用 输入OTA版本名称
            self.page_enter_version_name(version)
            # 调用 输入升级更新说明
            self.page_enter_up_description(description)
            # 调用 点击确定
            self.page_click_accept()
        except Exception as e:
            allure.attach("失败描述", "上传OTA包失败，原因：{}".format(e))
            # 截图
            self.screen_page()
            # 刷新
            self.refresh_current_page()
            raise Exception("上传OTA包失败")

    # 组合业务方法  -->删除OTA包业务直接调用
    @allure.step(title="删除OTA包操作")
    def del_ota_file(self):
        try:
            # 调用 点击第一个删除按钮
            self.page_click_first_del_btn()
            # 调用 点击确定
            self.page_click_accept()
        except Exception as e:
            allure.attach("失败描述", "删除OTA包失败，原因：{}".format(e))
            # 刷新
            self.refresh_current_page()
            assert False

    # 组合业务方法  -->ota搜索框业务直接调用
    @allure.step(title="ota搜索框操作")
    def ota_input_search(self, search_text):
        try:
            # 调用 输入搜索内容
            self.page_enter_search_text(search_text)
            # 调用 敲键盘的回车键
            self.knock_enter_key(Page.up_ota_search_input)
        except Exception as e:
            allure.attach("失败描述", "ota搜索框失败，原因：{}".format(e))
            # 截图
            self.screen_page()
            # 刷新
            self.refresh_current_page()
            # assert False
            return False

    # 组合业务方法  -->ota下拉框业务直接调用
    @allure.step(title="ota下拉框选择操作")
    def select_ota_type(self, option_text):
        try:
            # 调用 点击下拉框
            self.page_click_select()
            # 调用 选择下拉选项 （"全部","客流机"/"抓拍机"/"识别机"）
            self.page_sel_type_option(option_text)
            sleep(3)
        except Exception as e:
            allure.attach("失败描述", "ota搜索框失败，原因：{}".format(e))
            # 刷新
            self.refresh_current_page()
            assert False

    # ----------------------------------------------------[断言]test脚本使用-------------------------------------------------

    # 断言  -->判断页面ota版本==升级版本【上传/删除OTA包断言使用】
    @allure.step(title="断言页面ota版本==上传版本")
    def if_new_ota_version_exits(self, description, version):
        try:
            # 调用 返回ota包版本文本值
            page_ota = self.page_get_ota_version(description)
            # 调用 断言 -->actual结果 == expect结果
            return self.base_if_equal(page_ota, version)
        except Exception as e:
            allure.attach("失败描述", "断言页面ota版本==升级版本，原因：{}".format(e))
            # 截图
            self.screen_page()
            # 刷新
            self.refresh_current_page()
            raise Exception("断言失败页面ota版本==上传版本")

    # 断言  -->断言搜索出所有文本值 == 搜索内容【搜索/筛选断言使用】
    @allure.step(title="断言搜索出所有文本值 == 搜索内容")
    def search_ota_text_equal_page(self, search_text):
        try:
            sleep(2)
            # 调用 返回搜索出的所有文本值列表及数量
            all_text = self.page_get_ota_text(search_text)[0]
            x = 0
            for i in all_text:
                if search_text in i:
                    x += 1
            # 调用 断言 -->actual结果 == expect结果
            return self.base_if_equal(x, len(all_text))
        except Exception as e:
            allure.attach("失败描述", "断言搜索出所有文本值 == 搜索内容失败，原因：{}".format(e))
            assert False


if __name__ == '__main__':
    p = PageUpgrade(get_driver())
    # 登录
    p.send_element(Page.login_email_id, Page.test_user)
    p.send_element(Page.login_password_id, Page.test_pwd)
    p.click_element(Page.login_btn_id)
    # 进入升级列表
    p.click_element(Page.gps_device_man_btn)
    p.click_element(Page.gps_up_list_btn)
    # 测试
    p.clear_ota_list()
